﻿#ifndef VtkExportModule_H_
#define VtkExportModule_H_
#include "ExportModule.h"
#include "NodalRecoveryModel.h"
#include "EnumDofValueType.h"
class Element;
#define VtkExportModule_Name "vtk"
#define VtkExportModule_dofVarsToExport "dofvals"
#define VtkExportModule_IntVarsToExport "intvals"
#define VtkExportModule_CellVarsToExport "cellvals"
#define VtkExportModule_nodalValType "nvtype"

class VtkExportModule : public ExportModule
{
protected:
	// 节点数据输出
	IntArray dofVarsToExport;
	// 内部变量输出
	IntArray intVarsToExport;
	// 单元变量输出
	IntArray cellVarsToExport;
	// 应力磨平类型
	NodalRecoveryModel::NodalRecoveryModelType type;
	// 应力磨平
	NodalRecoveryModel* smoother;
public:
	VtkExportModule(int n, Analysis* e);
	virtual ~VtkExportModule();

	void initial(Tag& tag) override;
	void doOutput(TimeStep* ctime, bool force = false) override;
	void initialize() override;
protected:
	// 获取vtk的输出文件
	FILE* getOutputStream(TimeStep* ctime);
	// 返回能够用vtk支持的单元数目
	int getNumberOfElementCells(Element* cell);
	// 返回每个vtk支持的单元的节点
	int getNumerOfNodesPerCell(int celltype);
	// 返回该单元对应的vtk单元类型
	int getVtkCellType(Element* cell);
	// 返回vtk节点数组
	void getVtkCellNodes(IntArray& answer, Element* elem);

	void exportDofVars(FILE* stream, TimeStep* ctime);
	void exportDofVarsAs(DofValueType type, FILE* stream, TimeStep* ctime);
	// 输出积分点到积分上的数据
	void exportIntVars(FILE* stream, TimeStep* ctime);
	// 输出单元的数据
	void exportCellVars(FILE* stream, int elemToProcess, TimeStep* ctime);
	NodalRecoveryModel* getSmoother();
};
#endif

